package com.zhiletu.collect.util;

import java.io.File;

import org.apache.log4j.Logger;

/**
 *
 * @Title: 在linux上使用Jpegoptim图片压缩工具
 * @Package com.zhiletu.collect.util
 * @Description: 图片压缩扩展
 * @author zhiletu.com
 * @date 2021年3月11日
 * @version V1.0
 */
public class Jpegoptim {
	private static Logger log = Logger.getLogger(Jpegoptim.class);

	public static void jpegotim(String currfilepath, long targetSize) {
		if (currfilepath == null || "".equals(currfilepath)) {
			log.error("图片路径为空");
			return;
		}

		File f = new File(currfilepath);

		if (f.isDirectory()) {
			log.error("不是文件");
			return;
		}

		if (!f.canRead()) {
			log.error("文件不存在或没有读权限");
			return;
		}
		long currSize = f.length();
		Jpegoptim.imgCompz(currfilepath, currSize, targetSize);
	}

	/**
	 * 压缩指定图片到设定的大小（有损压缩）
	 * @param currfilepath 绝对路径
	 * @param currSize 实际字节数
	 * @param targetSize 目标字节数
	 */
	protected static void imgCompz(String currfilepath, long currSize, long targetSize) {
		if (targetSize == 0)
			targetSize = 1;// 单位是byte 
		long per = 100l - targetSize * 100l / currSize;
		if (per <= 0l) // 小于压缩目标字节数，没必要压缩
			return;

		String command = "jpegoptim -m" + per + " " + currfilepath;
		boolean flag = false;
		try {
			flag = Shell.execShell(command);
		}
		catch (Exception e) {
			log.error(e);
		}
		if (flag)
			log.info("成功压缩：" + currfilepath);
		else
			log.info("压缩失败：" + currfilepath);
	}
}

/*
 无损压缩jpeg图像

为了无损地压缩一副JPG图片，使用：
1.$ jpegoptim photo.jpg 
2.photo.jpg 2048x153624bit N ICC JFIF [OK]882178-->821064 bytes (6.93%), optimized.

注意，原始图像会被压缩后图像覆盖。

如果jpegoptim不能无损美化图像，将不会覆盖它：
1.$ jpegoptim -v photo.jpg 
2.photo.jpg 2048x153624bit N ICC JFIF [OK]821064-->821064 bytes (0.00%), skipped.

如果你想保护原始图片，使用"-d"参数指明保存目录
1.$ jpegoptim -d ./compressed photo.jpg 

这样，压缩的图片将会保存在./compressed目录（以同样的输入文件名）

如果你想要保护文件的创建修改时间，使用"-p"参数。这样压缩后的图片会得到与原始图片相同的日期时间。
1.$ jpegoptim -d ./compressed -p photo.jpg 

如果你只是想看看无损压缩率而不是真的想压缩它们，使用"-n"参数来模拟压缩，然后它会显示出压缩率。
1.$ jpegoptim -n photo.jpg 

有损压缩JPG图像

万一你真的需要要保存在云空间上，你还可以使用有损压缩JPG图片。

这种情况下，使用"-m<质量>"选项，质量数范围0到100。（0是最好质量，100是最差质量）

例如，用50%质量压缩图片:
1.$ jpegoptim -m50 photo.jpg 
2.photo.jpg 2048x153624bit N ICC JFIF [OK]882178-->301780 bytes (65.79%), optimized.

在牺牲质量的基础上，将会得到一个更小的图片。

一次压缩多张JPEG图像

最常见的情况是需要压缩一个目录下的多张JPEG图像文件。为了应付这种情况，你可以使用接下来的脚本。
#!/bin/sh
# 压缩当前目录下所有*.jpg文件
# 保存在./compressed目录
# 并拥有与原始文件同样的修改日期
for i in*.jpg;do jpegoptim -d ./compressed -p "$i";done

*/
